package com.tensquare.manager.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import util.JwtUtil;

import javax.servlet.http.HttpServletRequest;

@Component
public class ManagerFilter extends ZuulFilter {

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 前置过滤器
     *
     * return "pre",在操作之前执行
     * return "post",在操作之后执行
     */
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * 过滤器的执行顺序
     * 数字越大，优先级越低
     * 优先级为0
     */
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * 是否执行该过滤器，true表示需要过滤
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     * 过滤器内执行的操作
     * （1）return 任何object的值都表示继续执行
     * （2）setsendzullRespponse(false)：表示不再继续执行
     */
    @Override
    public Object run() throws ZuulException {
        System.out.println("ManagerFilter 过滤器执行了。。。");

        // 得到上下文
        RequestContext requestContext = RequestContext.getCurrentContext();
        // 得到request
        HttpServletRequest request = requestContext.getRequest();

        // 第一次请求放行
        if (request.getMethod().equals("OPTIONS")) {
            return null;
        }

        // 登录放行
        if (request.getRequestURI().indexOf("login") > 0) {
            return null;
        }

        // 得到请求头
        String header = request.getHeader("Authorization");
        if (header != null && !"".equals(header)) {
            if (header.startsWith("Bearer ")) {
                // 获取token
                String token = header.substring(7);
                try {
                    // 解析token
                    Claims claims = jwtUtil.parseJWT(token);
                    String roles = (String) claims.get("roles");
                    if ("admin".equals(roles)) {
                        // 把头信息转发下去，并且放行
                        requestContext.addZuulRequestHeader("Authorization", header);
                        return null;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    requestContext.setSendZuulResponse(false); // 终止运行
                }
            }
        }

        requestContext.setSendZuulResponse(false);
        requestContext.setResponseStatusCode(403);
        requestContext.setResponseBody("权限不足");
        requestContext.getResponse().setContentType("text/html;charset=utf-8");

        return null;
    }
}
